package com.zhilei;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * rabbitMQ发布订阅模式
 *
 * @author 志磊
 */
public class PubSubConsumerA {
    public static void main(String[] args) throws IOException, TimeoutException {
        // 创建ConnectionFactory rabbitMQ的工厂连接模式
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("zhilei");
        factory.setPassword("zhilei");

        // 创建一个新的连接
        Connection connection = factory.newConnection();
        // 创建一个新的频道
        Channel channel = connection.createChannel();

        // 声明一个名为fanoutQueueA、fanoutQueueB的队列
        String fanoutQueueA = "fanout_exchange_a";
        channel.queueDeclare(fanoutQueueA, true, false, false, null);

        // 重写方法
        Consumer consumer = new DefaultConsumer(channel) {
            /**
             * 重写消息配送方法
             * @param consumerTag 消息的标签（标识）
             * @param envelope  信封（一些信息，比如交换机路由等等信息）
             * @param properties 配置信息
             * @param body 收到的消息数据
             * @throws IOException
             */
            @Override
            public void handleDelivery(String consumerTag,
                                       Envelope envelope,
                                       AMQP.BasicProperties properties,
                                       byte[] body) throws IOException {
                System.out.println("body = " + new String(body));
            }
        };

        /**
         * queue: 监听的队列名
         * autoAck: 是否自动确认，true：告知mq消费者已经消费的确认通知
         * callback: 回调函数，处理监听到的消息
         */
        channel.basicConsume(fanoutQueueA, true, consumer);

    }
}
